package com.woniuxy.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * @author 饶志
 * @version 1.0
 * @since 2025-07-15  11:08
 */
@Configuration
public class RabbitMqQueueConfig {

    // 业务队列名称（原有点赞队列）
    public static final String LIKE_QUEUE = "like_queue";
    // 死信交换机名称
    public static final String DLX_EXCHANGE = "like_dlx_exchange";
    // 死信队列名称
    public static final String DLQ_QUEUE = "like_dlq_queue";
    // 死信路由键（与业务队列关联）
    public static final String DLX_ROUTING_KEY = "like_dlx_key";

    /**
     * 声明点赞队列，队列持久化
     *
     * @return Queue
     */
    @Bean
    public Queue likeQueue() {
        Map<String, Object> args = new HashMap<>();
        // 指定死信交换机
        args.put("x-dead-letter-exchange", DLX_EXCHANGE);
        // 指定死信路由键（不设置则使用原消息的路由键）
        args.put("x-dead-letter-routing-key", DLX_ROUTING_KEY);
        // 设置消息过期时间（TTL，毫秒），超时未消费则进入死信队列
        args.put("x-message-ttl", 1000 * 60 * 60 * 6);
        // 最大重试次数，超过后进入死信队列
        args.put("x-max-retries", 5);

        return new Queue(LIKE_QUEUE, true, false, false, args); // 队列持久化
    }

    /**
     * 声明死信交换机（Direct类型）
     */
    @Bean
    public DirectExchange dlxExchange() {
        return new DirectExchange(DLX_EXCHANGE, true, false); // 持久化交换机
    }

    /**
     * 声明死信队列（DLQ）并绑定到死信交换机
     */
    @Bean
    public Queue dlqQueue() {
        return new Queue(DLQ_QUEUE, true); // 持久化队列
    }

    /**
     * 绑定死信队列到死信交换机（使用死信路由键）
     */
    @Bean
    public Binding dlqBinding() {
        return BindingBuilder.bind(dlqQueue())
                .to(dlxExchange())
                .with(DLX_ROUTING_KEY);
    }

    /**
     * 配置JSON消息转换器
     * 使生产者发送JSON格式消息，消费者端能正确反序列化
     */
    @Bean
    public MessageConverter messageConverter() {
        return new Jackson2JsonMessageConverter();
    }
}
